﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BE;
using DAL;
using BE.SearchCriteria;
using BLL.Exceptions;
using System.Transactions;

namespace BLL
{
    public class CampañasZonasCierresBLL : BaseBLL
    {

        public static CampañasZonasCierresBE SeleccionarPorZona(CampañasZonasCierresBE oCampañasZonasCierresBE)
        {
            CampañasZonasCierresDAL oCampañasZonasCierresDAL = new CampañasZonasCierresDAL();
            return oCampañasZonasCierresDAL.SeleccionarPorZona(oCampañasZonasCierresBE);
        }

        public static List<CampañasZonasCierresBE> SeleccionarPorIdCampaña(int pIdCampaña)
        {
            CampañasZonasCierresDAL oCampañasZonasCierresDAL = new CampañasZonasCierresDAL();
            return oCampañasZonasCierresDAL.SeleccionarPorIdCampaña(pIdCampaña);

        }

        public static void Guardar(int pIdCampaña, List<CampañasZonasCierresBE> pListBE)
        {
            try
            {
                Validar(pListBE);

                // Se guardan únicamente registros que tengan alguna de las fechas establecidas
                List<CampañasZonasCierresBE> oListBE = ObtenerElementosConValor(pListBE);

                using (TransactionScope scope = new TransactionScope())
                {
                    CampañasZonasCierresDAL oCampañasZonasCierresDAL = new CampañasZonasCierresDAL();
                    oCampañasZonasCierresDAL.DeleteByIdIdCampaña(pIdCampaña);
                    oCampañasZonasCierresDAL.InsertarBatch(oListBE);

                    scope.Complete();
                }
            }
            catch (Exception ex)
            {
                if (!HandleException(ex))
                    throw;
            }
        }

        private static List<CampañasZonasCierresBE> ObtenerElementosConValor(List<CampañasZonasCierresBE> pListBE)
        {
            if (pListBE == null || pListBE.Count == 0)
                return null;

            List<CampañasZonasCierresBE> oListBE;
            oListBE = pListBE.Where(x => x.FechaCierre.HasValue && x.FechaInicio.HasValue && x.FechaLlegada.HasValue).ToList();
            return oListBE;
        }

        private static void Validar(List<CampañasZonasCierresBE> pListBE)
        {
            List<CampañasZonasCierresBE> oListBE = ObtenerElementosConValor(pListBE);
            if (oListBE == null || oListBE.Count == 0)
                throw new BLLException("Debe cargar las fechas de inicio, cierre y llegada de por lo menos una zona.");

            // Se buscan elementos que ni;
            //              - Tengan valores en todas las fechas
            //              - Sean nulas todas sus fechas
            // Es decir, que tengan valores en algunas fechas y en otras no.
            // En caso de encontrar un elemento así, impedir su grabación
            CampañasZonasCierresBE oElemBE = pListBE.Find(x =>  
                                                          !(x.FechaCierre.HasValue && x.FechaInicio.HasValue && x.FechaLlegada.HasValue ||
                                                            !(x.FechaCierre.HasValue || x.FechaInicio.HasValue || x.FechaLlegada.HasValue))
                                                         );
            if (oElemBE != null)
                throw new BLLException("Las zonas deben tener fechas de inicio, cierre y llegada. O de lo contrario no tener fechas en absoluto.");

            oElemBE = oListBE.Find(x => x.FechaInicio > x.FechaCierre || x.FechaCierre > x.FechaLlegada);
            if (oElemBE != null)
                throw new BLLException(string.Format("Zona {0}: La fecha de inicio debe ser anterior a la fecha de cierre, y ésta anterior a la fecha de llegada", oElemBE.oZonasBE.Descripcion));


        }

        public static List<CampañasZonasCierresBE> SeleccionarPorZonaCampaña(CampañasZonasCierresBE oCampañasZonasCierresBE)
        {
            CampañasZonasCierresDAL oCampañasZonasCierresDAL = new CampañasZonasCierresDAL();
            return oCampañasZonasCierresDAL.SeleccionarPorZonaCampaña(oCampañasZonasCierresBE);
        }


    }
}